// 导入express
const express = require('express')
//创建应用对象
const app = express();

// 导入生成JWT字符串的包
const jwt = require('jsonwebtoken')
// 导入用于将客户端发送过来的JWT字符串 , 解析还原成JSON对象的包
const expressjwt = require("express-jwt")
// 导入并挂载cors跨域
const cors = require('cors')
app.use(cors())

// 使用中间件保护以 /Admin 开头的路由
app.use('/Admin', authenticate);
function authenticate(req, res, next) {
    // 1. 从 Header 获取 Token
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1]; // Bearer Token 格式
    // 2. 检查 Token 是否存在
    if (!token) {
        // return res.status(401).json({ message: '未提供身份验证令牌' });
        res.status(401);
        return res.send({stats:401,message: '未提供身份验证令牌' });
    }
    // 3. 验证 Token
    const secretKey = 'MdsMyu'; // 必须与生成时使用的密钥一致
    jwt.verify(token, secretKey, (err, decoded) => {
        if (err) {
            // 4. 处理验证失败的情况
            let message = '无效的令牌';
            if (err.name === 'TokenExpiredError') {
                message = '令牌已过期';
            }
            return res.status(401).json({ message });
        }
        console.log('验证成功')
        // 5. 验证成功，将解码信息附加到请求对象
        req.user = decoded;
        next(); // 继续后续处理
})
}
//封装res.cc函数(要挂载在接口之前)
app.use((req,res,next)=>{
    // status==0为成功;=1为失败 , 默认设置为1,方便处理失败的情况
    res.cc = function (err,status = 0,msg){
        if(status==0){
            res.status(501);
            res.send({
                // 状态
                status,
                // 状态描述,判断err是错误对象还是字符串 判断err是否是Error的一个实例
                msg:err instanceof Error ? err.message : err,
                data:[]
            })
        }else{
            res.send({
                // 状态
                status,
                msg:msg,
                data:err
            })
        }
    }
    next()
})

// 解析 application/json 类型的请求体
app.use(express.json());

// 解析 application/x-www-form-urlencoded 类型的请求体
app.use(express.urlencoded({ extended: false }));


// // 设置哪些接口是不需要权限的
// app.use(expressJWT({secret:config.jwtSecretKey}).unless({path:[/^\/Api\//]}))

// 挂载用户接口
const user= require('../AdminApi/index');
// 挂载订单接口
const order= require('../AdminApi/order');
// 挂载商品接口
const shop_type= require('../AdminApi/shop_type');
// 挂载用户资料接口
const user_info= require('../AdminApi/user_info');
// 挂载用户资料接口
const sale_Data= require('../AdminApi/sale_Data');
// 挂载饭店接口
const hotel= require('../AdminApi/hotel');
// 挂载路由接口
const route= require('../AdminApi/route');
const stream = require("node:stream");
app.use(user).use(user_info).use(order).use(shop_type).use(sale_Data).use(hotel).use(route);

// 启动服务
app.listen(3001,()=>{
    console.log('服务已启动')
});
